/********************************************************************************
 * Copyright (c)2016-2020, ShenZhen WanJiaAn Technology CO.,LTD.
 * All Rights Reserved.
 *
 * File Name     : DevWifi.h
 * Author        : joki.zhu
 * Date          : 2019-10-16
 *
 * Record        :
 * 1.Date        : 2019-10-16
 *   Author      : joki.zhu
 *   Modification: Created file
 ********************************************************************************/

#ifndef __DEVWIFI_H__
#define __DEVWIFI_H__


#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif /* __cplusplus */

#define MAX_SSID_LENGTH 32

typedef enum {
    WIFI_ENCRYPT_NULL = -1,
    WIFI_ENCRYPT_OPEN,
    WIFI_ENCRYPT_WPA,
    WIFI_ENCRYPT_WPA2,
    WIFI_ENCRYPT_WEP,
    WIFI_ENCRYPT_WPA_WPA2,
    WIFI_ENCRYPT_MAX,
}WIFI_ENCRYPT_TYPE_E;

typedef enum {
    WIFI_CONFIG_NONE = 0,           /**< WIFI配置初始化状态 */
    WIFI_CONFIG_SOUNDWAVE_START,    /**< WIFI配置声波开始 */
    WIFI_CONFIG_CONNECT_START,      /**< WIFI配置连接开始 */
    WIFI_CONFIG_CONNECT_FAILED,     /**< WIFI配置连接失败 */
    WIFI_CONFIG_CONNECT_SUCCESS,    /**< WIFI配置连接成功 */
}WIFI_CONFIG_STATUS_E;

typedef enum {
	WIFI_DISCONNECTED,                          /**< wifi连接断开 */
	WIFI_CONNECTING,                            /**< wifi连接中 */
	WIFI_CONNECT_FAILED,                        /**< wifi连接失败 */
	WIFI_CONNECTED,                             /**< wifi已连接ap */
	WIFI_CONNECTED_WITH_INTERNET,               /**< wifi连接ap并连接到internet */
} WIFI_CONNECTION_STATUS;

typedef struct {
	WIFI_CONNECTION_STATUS connectionStatus;    /**< wifi连接状态 */
	char ssid[MAX_SSID_LENGTH];                 /**< ap ssid */
	int signalLevel;                            /**< wifi信号强度(暂时无法使用) */
} WIFI_STATUS_INFO_S;


#define WIFI_MAX_NUM    (32)

typedef struct {
    char                    bssid[128];     /**< BSSID */
    char                    ssid[128];      /**< SSID */
    char                    passwd[128];    /**< 密码 */
    WIFI_ENCRYPT_TYPE_E     mode;           /**< 加密模式 */
    char                    bConnected;     /**< 标识设备是否连接 */
    char                    bHidden;        /**< 标识设备是否隐藏 */
    int                     signaLevel;     /**< 信号级别，dBm*/
    int                     noiseLevel;     /**< 噪声级别，dBm*/
}WIFI_ATTR_INFO_S;

typedef struct {
    int cnt;
    WIFI_ATTR_INFO_S astAttrInfo[WIFI_MAX_NUM];
}WIFI_LIST_INFO_S;

/**
* WiFi休眠心跳属性
*/
typedef struct {
	char heartBeatData[64];		/**< 休眠心跳包内容 */
	int  heartBeatLen;			/**< 休眠心跳包内容长度 */
	char wakeupData[64];		/**< 唤醒包内容 */
	int  wakeupLen;				/**< 唤醒包内容长度 */
    struct {
		char ip[64];		    /**< 休眠心跳服务器地址 */
		int  port;				/**< 休眠心跳服务器端口 */
    } server[4];
	int  serverNum;				/**< 休眠心跳服务器个数 */
	int  interval;				/**< 休眠心跳包间隔(秒) */
}WIFI_SLEEP_ATTR_S;

typedef enum {
    WIFI_MODE_STA = 0,
    WIFI_MODE_AP,
    WIFI_MODE_NONE,
}WIFI_MODE_E;

/**
* AP配置
*/
typedef struct {
	char ssid[32];
	char password[32];
	char channel;
	WIFI_ENCRYPT_TYPE_E mode;
}WIFI_AP_CONFIG_S;

/**
* WIFI模式属性
*/
typedef struct {
    WIFI_MODE_E enMode;
    WIFI_AP_CONFIG_S stApConfig;
}WIFI_MODE_ATTR_S;

/**
 * @brief WiFi初始化
 *
 * @param 无
 * 
 * @return |0|成功| |非0|失败|
 *
 * @attention 无
 */
int WifiInit(void);

/**
 * @brief 获取WiFi唤醒原因 枚举hisi_wow_wakeup_reason_type_enum
 *
 * @param 无
 * 
 * @return |0|成功| |非0|失败|
 *
 * @attention 无
 */
int WifiGetWakeupReason(void);


/**
 * @brief 连接WiFi,并保存配置
 *
 * @param[in] ssid 热点名称
 * @param[in] pwd  热点密码
 * @param[in] enEncryptType 加密类型
 * 
 * @return |0|成功| |非0|失败|
 *
 * @attention 无
 */
int WifiSetConnect(char *ssid, char *pwd, WIFI_ENCRYPT_TYPE_E enEncryptType);

/**
 * @brief 断开WiFi连接
 *
 * @param 无
 * 
 * @return |0|成功| |非0|失败|
 *
 * @attention 无
 */
int WifiSetDisconnect(void);

/**
 * @brief 连接配置中已保存的WiFi
 *
 * @param 无
 * 
 * @return |0|成功| |非0|失败|
 *
 * @attention 无
 */
int WifiSetConnectLocalWifi(void);

/**
 * @brief 获取WiFi状态
 *
 * @param 无
 * 
 * @return |0|成功| |非0|失败|
 *
 * @attention 无
 */
int WifiGetStatus(WIFI_STATUS_INFO_S *pstStatusInfo);

/**
 * @brief 获取周边WiFi列表信息
 *
 * @param[in] pstWifiListInfo WIFI列表信息
 * 
 * @return |0|成功| |非0|失败|
 *
 * @attention 无
 */
int WifiGetListInfo(WIFI_LIST_INFO_S *pstWifiListInfo);

/**
 * @brief 获取WiFi连接状态
 *
 * @param 无
 * 
 * @return |1|连接| |0|未连接|
 *
 * @attention 无
 */
int WifiCheckIsConnected();

/**
 * @brief 设置默认WiFi配置
 *
 * @param 无
 * 
 * @return |0|成功| |非0|失败|
 *
 * @attention 无
 */
int WifiSetDefaultConfig(void);

/**
 * @brief 检查WiFi配置是否存在
 *
 * @param 无
 * 
 * @return |1|存在| |0|不存在|
 *
 * @attention 无
 */
int WifiCheckIsExistentConfig(void);

/**
 * @brief 获取WiFi休眠配置
 *
 * @param[out] pstSleepAttr WiFi休眠属性
 * 
 * @return |0|成功| |非0|失败|
 *
 * @attention 无
 */
int WifiGetSleepConfig(WIFI_SLEEP_ATTR_S *pstSleepAttr);

/**
 * @brief 设置WiFi休眠心跳
 *
 * @param[in] stSleepAttr WiFi休眠属性
 * 
 * @return |0|成功| |非0|失败|
 *
 * @attention 无
 */
int WifiSetSleepHeartBeat(WIFI_SLEEP_ATTR_S stSleepAttr);

/**
 * @brief 设置WiFi进入休眠模式
 *
 * @param 无
 * 
 * @return |0|成功| |非0|失败|
 *
 * @attention 无
 */
int WifiSetSleepMode(void);


int WifiCheckSsidIsExistent(char *ssid);

int WifiStopStaMode(void);

int WifiGetApConfig(WIFI_AP_CONFIG_S *pstApConfig);

/**
 * @brief 切换WiFi模式
 *
 * @param[in] stModeAttr 模式属性
 * 
 * @return |0|成功| |非0|失败|
 *
 * @attention 若切换为AP模式,需填充AP配置. 切换STA模式,暂不需要填充配置
 */
int WifiSetMode(WIFI_MODE_ATTR_S     stModeAttr);


/**
 * @brief WIFI去初始化
 *
 * @param 无
 * 
 * @return |0|成功| |非0|失败|
 *
 * @attention 无
 */
int WifiDeinit(void);

#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */


#endif /* __DEVWIFI_H__ */
